package cn.demo.common.core.page;


import cn.demo.common.utils.ObjUtils;
import cn.demo.common.utils.StringUtils;
import cn.demo.common.utils.sql.SqlUtil;
import com.mybatisflex.core.paginate.Page;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 分页查询实体类
 *
 * @author xtjun
 */

@Data
public class PageQuery implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 当前页码，从 1 开始
     */
    private Integer pageNum;

    /**
     * 分页大小
     */
    private Integer pageSize;

    /**
     * 当前记录起始索引 默认值
     */
    public static final int DEFAULT_PAGE_NUM = 1;

    /**
     * 每页显示记录数 默认值 默认查全部
     */
    public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;

    /**
     * 非必须值，若传入该值，mybatis-flex 则不再去查询总数据量（若传入小于 0 的数值，也会去查询总量）。
     */
    private Long totalRow;

    private String orderByColumn;
    private String order;

    public Boolean isAsc(){
        if (StringUtils.isEmpty(order) || StringUtils.isEmpty(orderByColumn)){
            return null;
        }
        return order.equals("ascending") || order.equals("asc");
    }

    public String getOrderByColumn() {
        return StringUtils.fromCamelCase(SqlUtil.escapeOrderBySql(orderByColumn));
    }

    public <T> Page<T> build() {
        Integer pageNum = ObjUtils.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);
        Integer pageSize = ObjUtils.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);
        if (pageNum <= 0) {
            pageNum = DEFAULT_PAGE_NUM;
        }
        Page<T> page = new Page<>(pageNum, pageSize);
        if (null != totalRow && totalRow > 0){
            page.setTotalRow(totalRow);
        }
        return page;
    }

}
